import com.tool.javabeenc.Student;

import java.lang.reflect.*;

public class FanSheCode {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        /*
         * 获取class对象的三种方式
         * 1.Class.forName("全类名")
         * 2.类名.class
         * 3.对象.getClass()
         *
         * 这三种获取class字节码文件的方式获取的都是同一个对象 连地址都相同！
         * */

        //class.forName("全类名")
        //Class clazz1 = Class.forName("com.tool.javabeenc.Student");
        //System.out.println(clazz1);

        //2.类名.class
        //Class clazz2 = com.tool.javabeenc.Student.class;
        //System.out.println(clazz2);

        //3.对象.getClass()
        //Student stu = new Student();
        //Class clazz3 = stu.getClass();
        //System.out.println(clazz3);



        //Class c=Class.forName("com.tool.javabeenc.Student");

        //获取所有公共的构造方法 getConstructors()
        //Constructor[] constructors = c.getConstructors();
        //for (Constructor constructor : constructors) {
        //    System.out.println(constructor);
        //}


        //获取所有构造方法 getDeclaredConstructors()
        //Constructor[] constructors = c.getDeclaredConstructors();
        //for (Constructor constructor : constructors) {
        //    System.out.println(constructor);
        //}

        //获取单个构造方法 getDeclaredConstructor()
        //Constructor constructor1 = c.getDeclaredConstructor();
        //System.out.println(constructor1);
        //获取单个构造方法 getDeclaredConstructor(Class)... maarepterTyesp 可以根据类型获取构造方法
        //Constructor constructor2 = c.getDeclaredConstructor(int.class);
        //System.out.println(constructor2);
        //获取单个构造方法 getDeclaredConstructor(Class... parameterTypes)

        //Constructor constructor3 = c.getDeclaredConstructor(String.class, int.class);
        //int modifiers =constructor3.getModifiers();
        //返回的是一个int类型的数字 我们可以通过Modifier类的toString方法将其转换为字符串
        //System.out.println(modifiers);
        //System.out.println(Modifier.toString(modifiers));

        //输出参数的类型
        //Constructor constructor4 = c.getDeclaredConstructor(String.class, int.class);
        //Parameter[] parameters = constructor4.getParameters();
        //for (Parameter parameter : parameters) {
        //    System.out.println(parameter);
        //}

        //可以根据获取出来的构造方法映射创建对象
        //Constructor constructor5 = c.getDeclaredConstructor(String.class, int.class);
        //临时取消访问权限检查
        //constructor5.setAccessible(true);
        //创建对象
        //Student stu = (Student) constructor5.newInstance("张三", 18);
        //System.out.println(stu);

        Class c=Class.forName("com.tool.javabeenc.Student");

        //获取公共成员变量
        //Field[] fields = c.getFields();
        //for (Field field : fields) {
        //    System.out.println(field);
        //}

        //获取所有成员变量
        //Field[] fields = c.getDeclaredFields();
        //for (Field field : fields) {
        //    System.out.println(field);
        //}

        //获取指定成员变量
        //Field field = c.getDeclaredField("name");
        //System.out.println(field);
        //获取指定成员变量的访问权限
        //int modifiers = field.getModifiers();
        //System.out.println(Modifier.toString(modifiers));
        //获取指定成员变量的类型
        //Class type = field.getType();
        //System.out.println(type); //String




    }
}
